/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package br.siagefi.mb;



import br.siagefi.enuns.TipoConta;
import br.siagefi.model.ContaBancaria;
import br.siagefi.service.ContaBancariaService;
import br.siagefi.util.FacesUtil;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

/**
 *
 * @author NOTE
 */

@ManagedBean
@SessionScoped
public class ContaBean implements Serializable{
    
   private ContaBancaria conta;
   private final ContaBancariaService service;
   private List<ContaBancaria> contas;
   private String tipoConta;
   private boolean habilitaTipoConta;

    public ContaBean() {
        this.conta = new ContaBancaria();
        this.service = new ContaBancariaService();
        this.listarContas();
        this.habilitaTipoConta = true;
    }
    
    // regras de negócio
    
    public String encerrarConta(){
        if(service.existeLancamentoVinculadoAVencer(conta)){
            FacesUtil.addErrorMessage("Conta possui lançamentos vinculados a vencer. Encerramento não permitido.");
        }else {
            if(this.getConta().getSaldo() != 0){
                FacesUtil.addErrorMessage("Conta possui saldo diferente de zero. Encerramento não permitido.");
            }else {
                this.conta.setDataEncerramento(Calendar.getInstance().getTime());
                this.conta.setSituacao("Encerrada");
                service.alterar(this.getConta());
                FacesUtil.addSuccessMessage("Conta encerrada com sucesso");
            }
        }
        this.limpar();
        this.listarContas();
        return "conta";
    }
    
    // navegação
    
    //acesso pelo template
    public String gerenciarConta(){
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("contaBean");
        return "/pages/users/administrador/conta";
    }
 
    public String novo() {
        if(this.getTipoConta() != null){
            this.getConta().setSituacao("ABERTA");
            if(this.getTipoConta().equals("BANCARIA")){
                return "incluirContaBancaria";
            } 
            if(this.getTipoConta().equals("CAIXA")){    
                return "incluirConta";
            }
        }
        FacesUtil.addSuccessMessage("Informe o tipo de Conta.");
        this.limpar();
        this.setHabilitaTipoConta(false);
        return "conta";
    }
    
    public String alterar(ContaBancaria conta){
        this.setConta(conta);
        if(conta.getBanco() == null){
            return "incluirConta";
        } else {
            return "incluirContaBancaria";
        }
    }
    
    public String voltar(){
        this.limpar();
        return "conta";
    }
    
    public String encerrar(){
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("ManagerBean");  
        return "/pages/users/index";
    }
    
    // persistência
    
    public String gravar(){
       if(this.getConta().getId() == null){
           //incluir
           if(service.jaExiste(this.getConta())){
              FacesUtil.addErrorMessage("Conta já cadastrada.");
           }else {
               if(service.exiteContaMesmoNome(this.getConta())){
                   FacesUtil.addErrorMessage("Nome de conta já utilizado.");
               }else {
                  service.inserir(this.getConta());
                  this.listarContas();
                  FacesUtil.addSuccessMessage("Conta incluida com sucesso!");
               }
            }
       }else { 
           //alterar
           if(service.exiteContaMesmoNome(this.getConta())){
                   FacesUtil.addErrorMessage("Nome de conta já utilizado.");
           }else {
               service.alterar(this.getConta());
               this.listarContas();
               FacesUtil.addSuccessMessage("Conta alterada com sucesso!");
           }
       }       
       limpar();
       this.listarContas();
       this.setHabilitaTipoConta(true);
       return "conta";
    }
    
    public String remover(ContaBancaria conta){
        if(service.existeLancamentoVinculado(conta)){
            FacesUtil.addErrorMessage("Conta com lançamentos vinculados. Exclusão não permitida.");
        }else {
            if(conta.getSaldo() != 0){
                FacesUtil.addErrorMessage("Conta possui saldo diferente de zero. Encerramento não permitido.");
            }else {
                service.remover(conta);
                this.limpar();
                FacesUtil.addSuccessMessage("Conta excluida com sucesso!");
            }
        }
        this.listarContas();
        return "conta";
    }
    
    public final String listarContas(){
         this.setContas(service.listar());
         return "conta";
    }
    
    // métodos de apoio 
    
    public void limpar(){
        this.setTipoConta(new String());
        this.setHabilitaTipoConta(true);
        this.conta = new ContaBancaria();
        this.setContas(new ArrayList<ContaBancaria>());
        this.listarContas();
    }
    
    
    // listas e outros dados
    
     public List<TipoConta> getTiposConta() {
        return Arrays.asList(TipoConta.values());
    }
     
     public Date getDataAtual(){
        return new GregorianCalendar().getInstance().getTime();
    }
    
    // getters e setters
    
    public ContaBancaria getConta() {
        return conta;
    }

    public void setConta(ContaBancaria conta) {
        this.conta = conta;
    }

    public List<ContaBancaria> getContas() {
        return contas;
    }

    public void setContas(List<ContaBancaria> contas) {
        this.contas = contas;
    }

    public String getTipoConta() {
        return tipoConta;
    }

    public void setTipoConta(String tipoConta) {
        this.tipoConta = tipoConta;
    }

    public boolean isHabilitaTipoConta() {
        return habilitaTipoConta;
    }

    public void setHabilitaTipoConta(boolean habilitaTipoConta) {
        this.habilitaTipoConta = habilitaTipoConta;
    }
    
}
